home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / lpc / synthesis / lpcplay.c < prev    next >
C/C++ Source or Header  |  1991-12-11  |  15KB  |  498 lines

  1. #include "../../H/ugens.h"
  2. #include "../../H/sfheader.h"
  3. #include <math.h>
  4. #include <stdio.h>
  5. #define RESIDAMP     0
  6. #define RMSAMP       1
  7. #define THRESH       2
  8. #define PITCH        3
  9.  
  10. int anal;
  11. float cq,outold;
  12. extern SFHEADER sfdesc[NFILES];
  13.  
  14. #define MAXPOLES 60
  15. #define MAXVALS 10000
  16. int framsize;
  17. int fprec;
  18. int recsize;
  19. int bprec;
  20. int bpframe;
  21. int npolem1;
  22. int anal;
  23. int i;
  24. float cq,outold,maxdev;
  25. float perperiod = 1.0;
  26. float FloatJunk;
  27. float cutoff;
  28. extern SFHEADER sfdesc[NFILES];
  29. char dataset_name[80];
  30. float thresh,randamp,randoff,unvoiced_rate;
  31. int npoles;
  32. float risetime,decaytime;
  33.  
  34. double lpcplay(p,n_args)
  35. float *p;
  36. {
  37.         float amp,si,hn,phs,*f,srd2,magic,d,warpset();
  38.         float c[MAXPOLES+4],past[MAXPOLES*2],frames,frameno,ampmlt,errno;
  39.         int frame1;
  40.         float ballpole(),alpvals[MAXVALS],buzvals[MAXVALS],pchval[MAXVALS];
  41.         float *cpoint;
  42.         float x,transposition,newpch;
  43.         double shift();
  44.         int jcount,seed,i,nsamps,counter;
  45.         int nn,lastfr;
  46.         float transp,lasttr,tranincr;
  47.         float cps,tblvals[2],weight();
  48.         float rsnetc[9];
  49.         int reson_is_on;
  50.         float cf_fact,bw_fact;
  51.         float evals[5];
  52.         float *f1;
  53.         float actualcps,actualweight;
  54.         float peak;
  55.         int jj,datafields,unit;
  56.  
  57.         if(!n_args) {
  58.                 printf(" p[0]=starting time, p[1]=duration, p[2]=pitch,p[3]=frame1, p4=frame2 p[5]=amp, p[6]=warp p7=resonbw, p8=resoncf p9--> pitchcurves\n");
  59.                 return;
  60.         }
  61.     
  62.     unit = 1;  /* outputfile */
  63.         f1 = floc(2);
  64.         sbrrand(.1);
  65.         for(i=0; i<npoles*2; i++) past[i] = 0;
  66.  
  67.         if(anal <=0 ) {
  68.                 printf("%d !!!No open dataset!",anal);
  69.                 closesf();
  70.         }
  71.         srd2 = SR/2.;
  72.         magic = 512./SR;
  73.         jcount = phs = counter = 0; 
  74.         datafields = 10; /* number of fields before pitch curves */
  75.         seed = .1;
  76.         cpoint = c + 4;
  77.         p[1] = (p[1] > 0.) ? p[1] : ((p[4] - p[3] + 1.)/112.);
  78.         evset(p[1],risetime,decaytime,2,evals);
  79.         nsamps = setnote(p[0],p[1],unit);
  80.         frames = p[4] - p[3] + 1.;
  81.         frame1 = (int)p[3];
  82.         for(i=p[3]; i<= p[4]; i++) {
  83.                 d = i;
  84.                 if(getfr(d,c) < 0) break;
  85.                 pchval[i - (int)p[3]] = (c[PITCH] ? c[PITCH] : 256.);
  86.                 /* just in case I am using datasets with no pitch value
  87.                    stored */
  88.         }
  89.         /*p[4] = i; */
  90.         actualweight = weight(p[3],p[4],thresh);
  91.         if(!actualweight) actualweight = cpspch(p[2]);
  92.         if(ABS(p[2]) < 1.)  {
  93.                 FloatJunk=(p[2]/.12);
  94.                 FloatJunk=pow(2.0,FloatJunk);
  95.                 transposition=FloatJunk;
  96.                 transposition = (pow(2.0,(p[2]/.12)));
  97.         }
  98.         else if(p[2] > 0) transposition = cpspch(p[2])/actualweight;
  99.         else transposition = cpspch(-p[2]);  /* flat pitch */
  100.         if((n_args <= datafields) && (p[2] > 0)) {
  101.                 printf("\nOverall transposition: %f, actualweight = %f\n",transposition,actualweight);
  102.                 if(maxdev) 
  103.             readjust(maxdev,pchval,p[3],p[4],thresh,actualweight);
  104.                 for(i=frame1;i<=(int)p[4];i++) {
  105.                         pchval[(i - frame1)] *= transposition;
  106.                 }
  107.         }
  108.         else {
  109.                 nn=datafields-1;
  110.                 lastfr=frame1;
  111.                 lasttr=transposition;
  112.                 while((nn+=2)<n_args) {
  113.                         if(ABS(p[nn+1]) < 1.) {
  114.                                 transp = pow(2.0,(p[nn+1]/.12));
  115.                         }
  116.                         else {
  117.                                 transp = cpspch(ABS(p[nn+1]))/weight((float)lastfr,(p[nn]+1.),thresh);
  118.                         }
  119.                         tranincr=(transp-lasttr)/(p[nn]-lastfr);
  120.                         transp=lasttr;
  121.                         for(i=lastfr;i<(int)p[nn];i++) {
  122.                                 pchval[i-frame1]*=transp;
  123.                                 transp+=tranincr;
  124.                         }
  125.                         lastfr=p[nn];
  126.                         lasttr=transp;
  127.                 }
  128.                 if(p[n_args-2] < p[4]) {
  129.                 /* last frame in couplets wasn't last frame in batch, so use
  130.                                                 base value from there to the end */
  131.                         transp = transposition;
  132.                         for(i=lastfr;i<(int)p[4];i++) {
  133.                                 pchval[i-frame1]*=transp;
  134.                         }
  135.                 }
  136.         }
  137.         tableset(p[1],(int)(p[4]-p[3]+1),tblvals);
  138.         amp = p[5];
  139.         d = p[6];
  140.         actualweight = weight(p[3],p[4],thresh);
  141.         actualcps = cpspch(ABS(p[2]));
  142.     
  143.        //d = (d>1.) ? shift(actualweight,actualcps,(float)SR) : p[6];
  144.        d = (d>1.) ? .0001 : p[6];
  145.  
  146.         /* note, dont use this feature unless pitch is specified in p[2]*/
  147.  
  148.         f = (float *)floc(1);
  149.         for(i=0; i<9; i++) rsnetc[i]=0;
  150.         reson_is_on = p[7] ? 1 : 0;
  151.         cf_fact = p[7];
  152.         bw_fact = p[8];
  153.  
  154.         warpinit();
  155.         for(i=nsamps; i>0; i -=counter) {
  156.                 frameno = ((float)(nsamps - i)/nsamps)*frames + frame1;
  157.                 if(getfr(frameno,c) == -1) goto out;
  158.                 errno = (c[THRESH] > thresh) ? 0 : 1;  
  159.                 ampmlt = (errno) ? amp * c[RESIDAMP] : amp * c[RESIDAMP] * randamp;
  160.                 if(c[RMSAMP] < cutoff) ampmlt = 0;
  161.                 cps = tablei(nsamps-i,pchval,tblvals);
  162.                 newpch = cps;
  163.                 if((p[2]< 0) &&  (ABS(p[2]) >= 1)) newpch = transposition;
  164.                 if(reson_is_on) { rszset(cf_fact*cps, bw_fact*cf_fact*cps,1.,rsnetc);
  165.             //printf("%f %f %f %f\n",cf_fact*cps, bw_fact*cf_fact*cps,cf_fact,bw_fact,cps);
  166.             }
  167.                 si = newpch * magic;
  168.                 ampmlt *= evp(nsamps-i,f1,f1,evals);
  169.  
  170.                 if(d)   ampmlt *=  warpset(d,cpoint);
  171.                 hn = (int)(srd2/newpch)-2;
  172.                 counter = (float)(SR/(newpch * perperiod) ) * .5;
  173.                 counter = (counter > i) ? i : counter;
  174. /*printf("%f %f %f %f %d\n",frameno,errno,ampmlt,newpch,counter); */
  175.                 if(counter <= 0) break;
  176.  
  177.                 if(errno) 
  178.                         bbuzz(ampmlt,si,hn,f,&phs,buzvals,counter);
  179.                 else
  180.                         brrand(ampmlt,buzvals,counter);
  181.                 if(d) {
  182.             
  183.             d = (p[6] > 1.) ? shift(c[3],newpch,(float)SR) : p[6];
  184. //printf("d=%f %f %f\n",c[3],newpch,d);        
  185.          /*************
  186.             d = ABS(d) > .2 ? SIGN(d) * .15 : d;
  187.                         ***************/
  188.                         bwarppol(buzvals,past,d,cpoint,alpvals,counter);
  189.                 }
  190.                 else
  191.                 {
  192.                         ballpole(buzvals,&jcount,npoles,
  193.                         past,cpoint,alpvals,counter);
  194.                 }
  195.                 if(reson_is_on) bresonz(alpvals,rsnetc,alpvals,counter);
  196.  
  197.                 baddout(alpvals,unit,counter);
  198.  
  199.         }
  200. out:    endnote(unit);
  201. }
  202. double lpcin(p,n_args)
  203. float *p;
  204. {
  205.     float amp,si,hn,phs,*f,srd2,magic,d,warpset();
  206.     float c[MAXPOLES+4],past[MAXPOLES*2],frames,frame1,frameno,ampmlt,errno;
  207.     float ballpole(),alpvals[2048],buzvals[2048];
  208.     float randamp,randoff;
  209.     float *cpoint;
  210.     float x,transposition,newpch;
  211.     int jcount,seed,i,nsamps,counter;
  212.     float tblvals[2];
  213.     int nread,input, output, j,k,count;
  214.  
  215.  
  216.     if(n_args != 7) {
  217. printf(" incorrect argument list: p[0]=starting time, p[1]=duration,p[2]=frame1, p[3]=frame2 p[4]=amp,p[5]=d,p[6]=inputskip\n");
  218.         return;
  219.     }
  220.     if(anal <= 0) { printf("No lpc dataset has been opened\n"); return;}
  221.     input = 0; output=1;
  222.     if(sfchans(&sfdesc[output]) != 1) { 
  223.         printf("Output file must have 1 channel only\n");
  224.         return;
  225.         }
  226.     if(sfchans(&sfdesc[input]) != 1) { 
  227.         printf("Input file must have 1 channel only\n");
  228.         return;
  229.         }
  230.     
  231.     for(i=0; i<npoles*2; i++) past[i] = 0;
  232.  
  233.     srd2 = SR/2.;
  234.     magic = 512./SR;
  235.     jcount = phs = counter = 0; 
  236.     randamp = .1;
  237.     seed = .1;
  238.     cpoint = c + 4;
  239.  
  240.     nsamps = setnote(p[0],p[1],output);
  241.                  setnote(p[6],p[1],input);
  242.     frames = p[3] - p[2] + 1.;
  243.     frame1 = p[2];
  244.     amp = p[4];
  245.     d = p[5];
  246.  
  247.     if(anal <=0 ) {
  248.         printf("No open dataset!");
  249.         return;    
  250.     }
  251.  
  252.     warpinit();
  253.     for(i=nsamps; i>0; i -=counter) {
  254.             frameno = ((float)(nsamps - i)/nsamps)*frames + frame1;
  255.             if(getfr(frameno,c) == -1) break;
  256.             ampmlt = c[0];
  257.             newpch = c[3];
  258.             counter = (float)(SR/newpch);
  259.             counter = (counter > i) ? i : counter;
  260.             if(counter <= 0) break;
  261.  
  262.             nread=bgetin(buzvals,input,count=counter*sfchans(&sfdesc[input]));
  263.             if(!nread)  break;
  264.             if(d) {
  265.                                 ampmlt *=  warpset(d,cpoint);
  266.                                bwarppol(buzvals,past,d,cpoint,alpvals,counter);
  267.             }
  268.             else
  269.                 ballpole(buzvals,&jcount,npoles,
  270.                                past,cpoint,alpvals,counter);
  271.  
  272.             bmultf(alpvals,ampmlt,counter);
  273.             bwipeout(alpvals,output,counter); 
  274.         }
  275.     endnote(output);
  276. }
  277.  
  278. float warppol(sig,past,d,c)
  279. float sig,*past,d,*c;
  280. {
  281.         float temp1,temp2;
  282.         int n;
  283.  
  284.         temp1 = past[npolem1];
  285.         past[npolem1] = cq * outold - d * past[npolem1];
  286.         for(n=npoles-2; n>=0; n--) {
  287.                 temp2 = past[n];
  288.                 past[n] = d * (past[n+1] - past[n]) + temp1;
  289.                 temp1 = temp2;
  290.         }
  291.         for(n=0;n<npoles;n++)  sig += c[n] * past[n];
  292.         outold = sig;
  293.         return(sig);
  294. }
  295. float warpset(d,c)     
  296. float d,*c;
  297. {
  298.         int m;
  299.         float cl;
  300.  
  301.         for(m=1; m<npoles; m++)   c[m] += d * c[m-1];
  302.         cl = 1./(1.-d * c[npolem1]);
  303.         cq = cl * (1. - d * d);
  304.         return(cl);
  305. }
  306. warpinit()
  307. {
  308.         outold = 0;
  309. }
  310. bwarppol(sig,past,d,c,out,nvals)
  311. float *sig,*past,d,*c,*out;
  312. {
  313.         float temp1,temp2;
  314.         int i,n;
  315.         for(i=0; i<nvals; i++) {
  316.                 temp1 = past[npolem1];
  317.                 past[npolem1] = cq * outold - d * past[npolem1];
  318.                 for(n=npoles-2; n>=0; n--) {
  319.                         temp2 = past[n];
  320.                         past[n] = d * (past[n+1] - past[n]) + temp1;
  321.                         temp1 = temp2;
  322.                 }
  323.                 for(n=0;n<npoles;n++)  *sig += c[n] * past[n];
  324.                 *out++ = outold = *sig++;
  325.         }
  326. }
  327. getfr(frameno,c)
  328. float frameno,*c;
  329. {
  330.         int frame,i,j;
  331.         static float array[22*(MAXPOLES+4)];
  332.         float fraction;
  333.         static int oldframe = 0;
  334.         static int endframe = 0;
  335.         frame = (int)frameno;
  336.         fraction = frameno - (float)frame;
  337.         if(!((frame >= oldframe) && (frame < endframe))) {
  338.                 if(lseek(anal,((long)frame*(long)bpframe),0) == -1) {
  339.                         fprintf(stderr,"bad lseek on analysis file \n");
  340.                         return(-1);
  341.                 } 
  342.                 if(read(anal,(char *)array,bprec) <= 0) {
  343.                         fprintf(stderr,"reached eof on analysis file \n");
  344.                         return(-1);
  345.                 }
  346.                 oldframe = frame;
  347.                 endframe = oldframe + fprec - 1;
  348.         }
  349.         for(i=(frame-oldframe)*framsize,j=0; j<framsize; i++,j++)  
  350.                 *(c+j) = *(array+i) + fraction * (*(array+i+framsize) 
  351.                     - *(array+i));
  352.         return(0);
  353. }
  354. static  long    randx = 1;
  355.  
  356. /*
  357. srrand(x)
  358. unsigned x;
  359. {
  360.         randx = x;
  361. }
  362. */
  363. float table(nsample,array,tab)
  364.  
  365. long nsample;
  366. float *array,*tab;
  367.  
  368. {
  369.         register loc = ((float)(nsample)/(*tab)) * *(tab+1);
  370.         if(loc >= *(tab+1)) loc = *(tab+1);
  371.         return(*(array + loc));
  372. }
  373. float weight(frame1,frame2,throsh)
  374. float frame1,frame2,throsh;
  375. {
  376.         float c[MAXPOLES+4];
  377.         int i;
  378.         float xweight,sum;
  379.         xweight = sum = .001;
  380.         for(i=(int)frame1; i<(int)frame2; i++) {
  381.                 getfr((float)i,c);
  382.                 if((c[THRESH] <= throsh) || (throsh < 0.)) {
  383.                         xweight += c[RMSAMP];
  384.                         sum += (c[PITCH] * c[RMSAMP]);
  385.                 }
  386.         }
  387.         return(sum/xweight);
  388. }
  389.  
  390. double dataset(p,n_args)
  391. /* p1=dataset name, p2=npoles */
  392. float *p;
  393. int n_args;
  394. {
  395.         char *name;
  396.         int i;
  397.  
  398.         fprec=22;
  399.         if(n_args>1) {
  400.                 npoles=p[1];
  401.                 npolem1=npoles-1;
  402.                 framsize=npoles+4;
  403.                 recsize=fprec*framsize;
  404.                 bprec=recsize*FLOAT;
  405.                 bpframe=framsize*FLOAT;
  406.         }
  407.         lpcinit();
  408.         i=(int)p[0];
  409.         name=(char *)i;
  410.         if(strcmp(name,dataset_name)== 0) {
  411.                 printf("\n%s is already open.\n",name);
  412.                 return;
  413.         }
  414.         strcpy(dataset_name,name);
  415.         if((anal = open(name,0)) <= 0) {
  416.                 printf("Can't open %s\n",name);
  417.                 closesf();
  418.         }
  419. }
  420.  
  421. double lpcstuff(p,n_args)
  422. /* p0=thresh, p1=random amp, p2=unvoiced rate p3= rise, p4= dec, p5=thresh cutof*/
  423. float *p;
  424. int n_args;
  425. {
  426.         risetime=.01; decaytime=.1;
  427.         if(n_args>0) thresh=p[0];
  428.         if(n_args>1) randamp=p[1];
  429.         if(n_args>2) unvoiced_rate=p[2];
  430.         if(n_args>3) risetime=p[3];
  431.         if(n_args>4) decaytime=p[4];
  432.         if(n_args>5) cutoff = p[5]; else cutoff = 0;
  433.         printf("\nAdjusting settings for %s.\n",dataset_name); 
  434.         printf(" --------------------------------------- \n");
  435.         printf("Thresh: %f     Randamp: %f\n",thresh,randamp);
  436.         if(unvoiced_rate == 1)
  437.                 printf("Unvoiced frames played at normal rate.\n\n");
  438.         else
  439.                 printf("Unvoiced frames played at same rate as voiced 'uns.\n\n");
  440. }
  441.  
  442. lpcinit()
  443. {
  444.         recsize=framsize*fprec;
  445.         bprec=recsize*FLOAT;
  446.         bpframe=framsize*FLOAT;
  447. }
  448.  
  449. /* block version of rrand */
  450. /* a modification of unix rand() to return floating point values between
  451.    + and - 1. */
  452.  
  453.  
  454. sbrrand(x)
  455. unsigned x;
  456. {
  457.         randx = x;
  458. }
  459. brrand(am,a,j)
  460. float am,*a;
  461. {
  462.         int k;
  463.         for(k=0; k<j; k++) {
  464.                 int i = ((randx = randx*1103515245 + 12345)>>16) & 077777;
  465.                 *a++ = (float)(i/16384. - 1.) * am;
  466.         }
  467. }
  468.  
  469. double freset(p,n_args)
  470. float *p;
  471. {
  472.         perperiod = p[0];
  473.         printf(" frame reinitialization reset to %f times per period\n",perperiod);
  474. }
  475.  
  476. int NBYTES = 32768; profile()
  477. {
  478.     float p[9];
  479.     UG_INTRO("lpcplay",lpcplay);
  480.     UG_INTRO("lpcstuff",lpcstuff);
  481.     UG_INTRO("dataset",dataset);
  482.     UG_INTRO("freset",freset);
  483.     UG_INTRO("mp",mp);
  484.     UG_INTRO("mpset",mpset);
  485.     UG_INTRO("setdev",setdev);
  486.     UG_INTRO("lpcin",lpcin);
  487.     p[0]=1; p[1]=10; p[2]=1024; p[3]=1;
  488.     makegen(p,4);  /* store sinewave in array 1 */
  489.     p[0]=2; p[1]=7; p[2]=512; p[3]=0; p[4]=512; p[5]=1; 
  490.     makegen(p,6);
  491.     maxdev=0;
  492. }
  493. double setdev(p,n_args)
  494. float *p;
  495. {
  496.         maxdev = p[0];
  497. }
  498.